<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>寄生组合继承</title>
</head>
<body>
<script>
    /*
  * 继承 子类继承父类的属性和方法
  * 目的 可以让子类的 实例 能够使用父类的属性和方法
  *   父类 A
  *   子类 B
  * */
    //类 ==> 构造函数


    //寄生组合继承
    //结合原型链继承和call继承的方法,同时自己创建一个对象,并且让这个对象的原型指向父类构造函数的prototype.实现寄生组合继承

    /*
    * 特点:
    *   1.最完美的js继承解决方案
    *   2.父类私有的属性和方法,成为子类实例私有的属性和方法
    *   3.父类公有的属性和方法,成为子类实例公有的属性和方法
    * */

    //父类
    function A(x) {
        this.x = x;
        this.seyHello = function () {
            console.log("hello world");
        }
    }

    A.prototype.getX = function () {
        console.log(this.x);
    }

    //子类
    function B(y, x) {
        this.y = y;
        A.call(this, x);
    }

   /* let obj = {};
    obj.__proto__ = A.prototype
    //因为IE浏览器不支持用户在js中直接使用或者修改__proto__
    B.prototype = obj*/

    B.prototype = Object.create(A.prototype);
    B.prototype.constructor = B;
    B.prototype.getY = function () {
        console.log(this.y);
    }
    let b = new B(200, 100);
    console.log(b);


    // Object.create(arg) 创建空的对象,并且让这个空对象的__proto__指向传递的第一个参数

    Object.create = function (arg){
        //因为IE浏览器不支持用户在js中直接使用或者修改__proto__
        /*let obj = {};
        obj.__proto__ = arg;
        return obj*/

        function NewObj(){}
        NewObj.prototype = arg;
        return new NewObj()
    }



</script>
</body>
</html>